package com.modbus;

import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
import com.intelligt.modbus.jlibmodbus.exception.ModbusNumberException;
import com.intelligt.modbus.jlibmodbus.exception.ModbusProtocolException;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 当前为主机，读取slave数据，功能码04 Input Registers(3x)
 * 使用Modbus Slave工具作为从机发送数据通过
 */
public class App {
    public static void main(String[] args) throws UnknownHostException, ModbusIOException, ModbusNumberException, ModbusProtocolException {
        // 设置主机TCP参数
        TcpParameters tcpParameters = new TcpParameters();
        // 设置TCP的IP地址
        InetAddress address = InetAddress.getByName("127.0.0.1");
        // TCP参数设置ip地址
        tcpParameters.setHost(address);
        // TCP设置长链接
        tcpParameters.setKeepAlive(true);
        // TCP设置端口，默认端口502
        tcpParameters.setPort(Modbus.TCP_PORT);
        // 创建一个主机
        ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
        Modbus.setAutoIncrementTransactionId(true);
        // 从机地址
        int slaveId = 1;
        // 从寄存器读取开始地址
        int offset = 0;
        // 读取的寄存器数量
        int quantity = 10;
        if(!master.isConnected()){
            // 开启链接
            master.connect();
        }
        // 读取对应从机的数据，readInputRegisters读取的写寄存器，功能码04
        int[] registerValues = master.readInputRegisters(slaveId, offset, quantity);
        // 控制台输出
        for(int value : registerValues){
            System.out.printf("Address: %s, Value: %s%n", offset++, value);
        }
    }
}
